home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-13
/
ncu_edit.zip
/
EDIT.ASM
< prev
next >
Wrap
Assembly Source File
|
1992-12-06
|
50KB
|
1,837 lines
;=========================================================
; Author: Chen Jean-Yuan NCU-MIS 2A No.790854
;=========================================================
extrn display_:near
extrn ins_line:near
extrn del_line:near
extrn put_buff:near
extrn get_buff:near
extrn find_ptr:near
extrn load_act:near
extrn save_act:near
extrn write_act:near
extrn print_act:near
extrn newing:near
extrn help_win:near
extrn chg_drive:near
extrn p_ptr:word
extrn q_ptr:word
extrn r_ptr:word
extrn free_top:word
extrn free_ptr:word
extrn line_buf:byte
extrn block_top:word
extrn block_end:word
public info_win,refresh_,new_act,here_dir,read_line,show_name
public new_start,new_end,total_l,top_,bottom_,y_table,monitor,cursor_y
public file_top,file_ptr,file_name,handle_,this_dir
public psp_start
space equ 20h
color1 equ 07h
color2 equ 02h
color3 equ 07h
reverse1 equ 70h
reverse2 equ 70h
reverse3 equ 70h
escape equ 1 ;-----+
enter_s equ 28 ; |
f10 equ 68 ; |
f1 equ 59 ; |
f2 equ 60 ; |
f3 equ 61 ; |
pgup equ 73 ; |
pgdn equ 81 ; |
ctrl_pgup equ 132 ; |
ctrl_pgdn equ 118 ; |
up equ 72 ; |
left equ 75 ; |
right equ 77 ; Scan Code
down equ 80 ; |
inskey equ 82 ; |
delkey equ 83 ; |
homekey equ 71 ; |
endkey equ 79 ; |
d_key equ 32 ; |
o_key equ 24 ; |
m_key equ 50 ; |
b_key equ 48 ; |
k_key equ 37 ; |
h_key equ 35 ; |
p_key equ 25 ; |
n_key equ 49 ; |
y_key equ 21 ;-----+
backspace equ 8 ;-----+
escape_a equ 27 ; ASCII Code
enter_a equ 13 ;-----+
win_max equ 4
file_max equ 6
utl_max equ 5
block_max equ 7
GET_CHAR MACRO
push ax
pushf
mov ah,0
int 16h
mov char,ah
popf
pop ax
ENDM
GET_KEY MACRO
push ax
pushf
mov ah,0
int 16h
mov scan_key,ah
mov ascii_key,al
popf
pop ax
ENDM
NEW_ MACRO ;AX register save the Segment
LOCAL over_z,exist_
push es
push bx
cmp free_top,0
jne exist_
add new_end,2
mov ax,new_end
jmp over_z
exist_: mov ax,free_top
mov es,ax
mov bx,es:[0]
mov free_top,bx
over_z: pop bx
pop es
ENDM
FREE_ MACRO _ptr
LOCAL n_empt,free_z
push es
pushf
mov ax,_ptr
cmp free_top,0
jne n_empt
mov free_top,ax
jmp free_z
n_empt: mov es,free_ptr
mov es:[0],ax
free_z: mov free_ptr,ax
mov es,ax
mov word ptr es:[0],0
popf
pop es
ENDM
GOTOXY MACRO x,y
mov dh,y
mov dl,x
inc dh
dec dl
mov bh,0
mov ah,2
int 10h
ENDM
CURSOR_1 MACRO
push cx
mov ch,0bh
mov cl,0ch
mov ah,1
int 10h
pop cx
ENDM
CURSOR_0 MACRO
push cx
mov ch,1ch
mov cl,1bh
mov ah,1
int 10h
pop cx
ENDM
data segment public
top_ db 0,0,24,'===== Top of File ======'
db 5 dup(0)
bottom_ db 0,0,24,'==== Bottom of File ===='
db 5 dup(0)
monitor dw ?
win_x dw ?
win_y dw ?
cursor_x dw ?
cursor_y dw ?
total_l dw ?
psp_start dw ?
new_start dw ?
new_end dw ?
pos_x db ?
pos_y db ?
col_start dw ?
p_lin dw ?
q_lin dw ?
r_lin dw ?
file_top dw ?
file_ptr dw ?
file_name db 'NONAME.DOC',3 dup(0)
this_dir db 80 dup(0)
handle_ dw ?
char db ?
scan_key db ?
ascii_key db ?
info_key db ?
ins_flag db ?
sub_line db 256 dup(?)
y_table dw 0, 160, 320, 480, 640, 800, 960,1120,1280,1440,1600,1760,1920
dw 2080,2240,2400,2560,2720,2880,3040,3200,3360,3520,3680,3840
win_head db ' File Edit Utility Block '
db ' ░▒▓ NCU MIS-2A No.790854 ▓▒░'
edit_head db '═══════════════════════════════════╡ Edi'
db 'tor ╞═════════════════════════════'
ins_fun db '══════'
ins_val db 'Insert'
win_info db ' F1-Help F2-Save F3-Load F10-Menu ' ;----+
db ' ║ Total ' ; |
str_ttl db ' ' ; |
win_info2 db ' │ Line ' ; Info
str_y db ' ' ; |
win_info3 db ' Col ' ; |
str_x db ' ' ;----+
win_file db 15,8,color2
db '┌─────────────╖'
db '│ Load F3 ║'
db '│ Save F2 ║'
db '│ Write to ║'
db '│ New ║'
db '│ OS Shell ║'
db '│ Exit ║'
db '╘═════════════╝'
win_utl db 20,7,color2
db '┌──────────────────╖'
db '│ Help F1 ║'
db '│ Change Drive ║'
db '│ Time & Date ║'
db '│ Print File ║'
db '│ Lock Terminal ║'
db '╘══════════════════╝'
win_block db 30,9,color2
db '┌────────────────────────────╖'
db '│ Set Begin Shift-Ctrl-B ║'
db '│ Set End Shift-Ctrl-K ║'
db '│ Copy Block Shift-Ctrl-O ║'
db '│ Delete Block Shift-Ctrl-D ║'
db '│ Move Block Shift-Ctrl-M ║'
db '│ Hide Block Shift-Ctrl-H ║'
db '│ Print Block Shift-Ctrl-P ║'
db '╘════════════════════════════╝'
good_bye db 'Thanks for Using this Editor !!! $'
data ends
;---------------------------------------
code segment public
assume cs:code,ds:data,ss:stack
main proc far
org 100h
start: push ds
mov ax,data
mov ds,ax
pop ax
mov psp_start,ax ;Save PSP addr. of Segment
mov ax,sp
mov cl,4
shr ax,cl
mov cx,ss
add ax,cx
inc ax
mov new_start,ax
mov new_end,ax
int 11h ;Initalize Monitor Type
and al,00110000b
cmp al,00110000b
mov monitor,0B000h ;Mono
je over_s
add monitor,800h ;Color
over_s:
mov al,0 ;Clear Screen
mov ch,2
mov cl,0
mov dh,22
mov dl,79
mov bh,07
mov ah,6
int 10h
mov win_x,1 ;Initialize New Values
mov cursor_x,1
mov cursor_y,1
mov total_l,1
mov col_start,1
mov pos_x,1
mov pos_y,2
mov block_top,1
mov block_end,1
mov free_top,0
mov ins_flag,0
NEW_
mov word ptr top_,ax
mov ax,seg top_
add ax,2
push es
mov es,word ptr top_
mov es:[0],ax
mov byte ptr es:[2],0
mov word ptr es:[30],0
pop es
call here_dir
call title_win
call info_win
call show_name
GOTOXY pos_x,pos_y
mov ax,0
push ax
mov ax,1
push ax
call display_
get_c: GET_KEY
xor ax,ax ;If Shift-Ctrl Both pressed
mov es,ax
mov al,es:[417h]
and al,00000111b
cmp al,4
jbe chk_k
call s_c_key
jmp get_c
chk_k: cmp ascii_key,0
je key_0
cmp ascii_key,224
je key_0
jmp comm_
key_0: cmp scan_key,f10 ;F10 pressed
jne key_1
call windows
jmp get_c
key_1: cmp scan_key,up ;Up-Arrow pressed
jne key_2
cmp cursor_y,1
je no_ch1
dec cursor_y
call info_win
cmp pos_y,1
je st_ch1
dec pos_y
GOTOXY pos_x,pos_y
jmp get_c
st_ch1: call refresh_
jmp get_c
no_ch1: mov pos_y,2
GOTOXY pos_x,pos_y
call refresh_
jmp get_c
key_2: cmp scan_key,down ;Down-Arrow pressed
jne key_3
mov ax,total_l
cmp cursor_y,ax
je no_ch2
inc cursor_y
call info_win
cmp pos_y,21
je st_ch2
inc pos_y
GOTOXY pos_x,pos_y
jmp get_c
st_ch2: call refresh_
jmp get_c
no_ch2: cmp total_l,20
jae mor_20
jmp get_c
mor_20: mov pos_y,20
GOTOXY pos_x,pos_y
call refresh_
jmp get_c
key_3: cmp scan_key,left ;Left-Arrow pressed
jne key_4
cmp cursor_x,1
je no_ch3
dec cursor_x
call info_win
cmp pos_x,1
je st_ch3
dec pos_x
GOTOXY pos_x,pos_y
jmp st__3
st_ch3: dec col_start
st__3: call refresh_
no_ch3: jmp get_c
key_4: cmp scan_key,right ;Right-Arrow pressed
jne key_5
cmp cursor_x,256
je no_ch4
inc cursor_x
call info_win
cmp pos_x,80
je st_ch4
inc pos_x
GOTOXY pos_x,pos_y
jmp no_ch4
st_ch4: inc col_start
call refresh_
no_ch4: jmp get_c
key_5: cmp scan_key,delkey ;Delete Key pressed
jne key_6
mov ax,cursor_y
push ax
call find_ptr
call put_buff ;Put Linked-List in Line-Buffer
mov ax,cursor_x
dec ax
cmp line_buf,al
ja shf_d1
mov ax,cursor_y
inc ax
cmp ax,total_l
jae no_del ;No Act at Last 2 Line
call extra_del
no_del: jmp get_c
shf_d1: xor cx,cx
mov cl,line_buf
mov di,offset line_buf
add di,ax
sub cx,ax
shf_d2: inc di
mov al,[di+1]
mov [di],al
loop shf_d2
dec line_buf
call get_buff
call refresh_
jmp get_c
key_6: cmp scan_key,homekey ;Home Key pressed
jne key_7
mov pos_x,1
GOTOXY pos_x,pos_y
mov cursor_x,1
call info_win
mov col_start,1
call refresh_
jmp get_c
key_7: cmp scan_key,endkey ;End Key pressed
jne key_8
mov ax,cursor_y
push ax
call find_ptr
call put_buff
xor ax,ax
mov al,line_buf
mov cursor_x,ax
inc cursor_x
call info_win
cmp line_buf,78
ja at_80
mov pos_x,al
inc pos_x
GOTOXY pos_x,pos_y
mov col_start,1
call refresh_
jmp get_c
at_80: mov pos_x,80
push ax
GOTOXY pos_x,pos_y
pop ax
sub ax,78
mov col_start,ax
call refresh_
jmp get_c
key_8: cmp scan_key,inskey ;Insert Key pressed
jne key_9
mov di,offset ins_fun
cmp ins_flag,0
je inson
mov cx,6
insoff: mov byte ptr [di],'═'
inc di
loop insoff
mov ins_flag,0
call title_win
jmp get_c
inson: mov si,offset ins_val
mov ax,seg ins_fun
mov es,ax
cld
mov cx,6
rep movsb
mov ins_flag,1
call title_win
jmp get_c
key_9: cmp scan_key,f3 ;F3 Key pressed
jne key_10
call load_act
call refresh_
call info_win
GOTOXY pos_x,pos_y
jmp get_c
key_10: cmp scan_key,f2 ;F2 Key pressed
jne key_11
mov ax,offset this_dir[1]
push ax
call save_act
call refresh_
jmp get_c
key_11: cmp scan_key,pgup ;Page Up
jne key_12
mov ax,cursor_y
xor ch,ch
mov cl,pos_y
sub ax,cx
cmp ax,20
jg sub_20
cmp cursor_y,20
ja su__20
mov pos_y,2
mov cursor_y,1
GOTOXY pos_x,pos_y
jmp pg_up
su__20: add cx,ax
sub cx,20
mov pos_y,cl
GOTOXY pos_x,pos_y
sub_20: sub cursor_y,20
pg_up: call refresh_
call info_win
jmp get_c
key_12: cmp scan_key,pgdn ;Page Down
jne key_13
no_ct2: mov ax,total_l
sub ax,cursor_y
cmp ax,20
ja add_20
mov pos_y,1
mov ax,total_l
mov cursor_y,ax
GOTOXY pos_x,pos_y
jmp pg_up
add_20: add cursor_y,20
pg_dn: call refresh_
call info_win
jmp get_c
key_13: cmp scan_key,f1 ;F1 Key pressed
jne key_14
call help_win
call refresh_
jmp get_c
key_14: cmp scan_key,ctrl_pgup ;Control-Page Up
jne key_15
mov pos_y,2
mov cursor_y,1
GOTOXY pos_x,pos_y
call refresh_
call info_win
key_15: cmp scan_key,ctrl_pgdn ;Control-Page Down
jne key_16
mov ax,total_l
mov cursor_y,ax
cmp ax,20
jb at_20
mov al,20
at_20: mov pos_y,al
GOTOXY pos_x,pos_y
call refresh_
call info_win
key_16: jmp get_c
comm_: mov ax,cursor_y
push ax
call find_ptr
call put_buff ;Key in a Character
cmp ascii_key,backspace ;BackSpace Key pressed
jne comm_1
mov ax,cursor_x
cmp ax,1
jne con_
jmp get_c
con_: dec ax
cmp line_buf,al
ja shf_l1
jb same_l
dec line_buf
call get_buff
same_l: mov scan_key,left
jmp key_3
shf_l1: xor cx,cx
mov cl,line_buf
mov di,offset line_buf
add di,ax
sub cx,ax
shf_l2: mov al,[di+1]
mov [di],al
inc di
loop shf_l2
dec line_buf
call get_buff
jmp same_l
comm_1: cmp ascii_key,enter_a ;Enter Key pressed
je _13h
jmp comm_2
_13h: mov pos_x,1
mov col_start,1
cmp ins_flag,1
je ins_li
mov ax,total_l
cmp cursor_y,ax
je eq_hom
mov cursor_x,1
inc cursor_y
cmp pos_y,21
je sc_up1
inc pos_y
sc_up1: GOTOXY pos_x,pos_y
call info_win
call refresh_
jmp get_c
eq_hom: mov scan_key,homekey
jmp key_6
ins_li: inc cursor_y
mov ax,cursor_x
dec ax
mov cursor_x,1
cmp line_buf,al
ja cut_l
cmp pos_y,21
je sc_up2
inc pos_y
sc_up2: GOTOXY pos_x,pos_y
call ins_line
call refresh_
jmp get_c
cut_l: xor cx,cx ;Cut This Line to be 2 Parts
mov cl,line_buf
mov line_buf,al
sub cl,al
mov sub_line,cl
mov bx,seg sub_line
mov es,bx
mov di,offset sub_line+1
mov si,offset line_buf
add si,ax
inc si
cld
rep movsb
NEW_ ;===== Insert 1 Line =====
mov es,r_ptr ;P_ptr^.next:=NEW_ptr
mov es:[0],ax
mov es,ax
mov ax,p_ptr ;NEW_ptr^.next:=P_ptr
mov es:[0],ax
mov byte ptr es:[2],0
mov word ptr es:[30],0
mov p_ptr,es
inc total_l
call info_win
call get_buff
mov es,p_ptr
mov ax,es:[0]
mov p_ptr,ax
cmp pos_y,21
je sc_up3
inc pos_y
sc_up3: GOTOXY pos_x,pos_y
xor cx,cx
mov cl,sub_line
inc cx
mov bx,seg line_buf
mov es,bx
mov di,offset line_buf
mov si,offset sub_line
cld
rep movsb
call get_buff
call refresh_
jmp get_c
comm_2: cmp ascii_key,escape_a ;ESC Key pressed
jne comm_3
jmp get_c
comm_3: cmp cursor_x,256 ;Common Key
jne ok_
jmp get_c
ok_: mov di,offset line_buf
xor ax,ax
mov al,line_buf
mov cx,cursor_x
dec cx
cmp cl,line_buf
ja add_bk
inc cx
cmp cl,line_buf
jbe no_lng
mov line_buf,cl
add di,cx
mov al,ascii_key
mov [di],al
jmp p_link
no_lng: add di,cx
cmp ins_flag,0
je no_ins
cmp line_buf,255
je key_in
xor ax,ax
mov al,line_buf
neg cx
add cx,ax
inc cx
mov si,di
add si,cx
shf_r: mov al,[si-1]
mov [si],al
dec si
loop shf_r
inc line_buf
no_ins: mov al,ascii_key
mov [di],al
jmp p_link
add_bk: add di,ax
sub cl,line_buf
put_s: inc di
mov byte ptr [di],' '
loop put_s
mov ax,cursor_x
mov line_buf,al
mov al,ascii_key
mov [di+1],al
p_link: call get_buff
inc cursor_x
call info_win
cmp pos_x,80
je scro_
inc pos_x
GOTOXY pos_x,pos_y
jmp one_ch
scro_: inc col_start
one_ch: call refresh_
key_in: jmp get_c
main endp
refresh_ proc near
mov ax,cursor_y
xor bx,bx
mov bl,pos_y
sub ax,bx
inc ax
push ax
mov ax,col_start
push ax
call display_
refresh_ endp
title_win proc near ;Display Title
push es
push ax
push cx
pushf
mov es,monitor
cld
mov si,offset win_head
mov di,0
mov al,color1
mov cx,80
loop_w: movsb
stosb
loop loop_w
mov si,offset edit_head
mov di,y_table+2
mov al,color1
mov cx,80
loop_e: movsb
stosb
loop loop_e
mov di,y_table[2]
mov cx,6
add di,75
b__ed: mov byte ptr es:[di],0fh
add di,2
loop b__ed
popf
pop cx
pop ax
pop es
ret
title_win endp
info_win proc near
push ax
push cx
push di
push si
push es
call itoa_3
mov ax,offset str_y
push ax
push cursor_y
call itoa_5
mov ax,offset str_ttl
push ax
push total_l
call itoa_5
cld
mov es,monitor
mov di,y_table[46]
mov cx,80
mov si,offset win_info
mov al,reverse2
loop_i: movsb
stosb
loop loop_i
pop es
pop si
pop di
pop cx
pop ax
ret
info_win endp
windows proc near ;********************
push ax ;* Windows Function *
push cx ;********************
CURSOR_0
mov char,0
sel_: call title_win ;Refresh Screen
call refresh_
mov win_y,1
cmp char,f10
je exit_w
cmp win_x,1 ;File Window
jne srn1
call file_win
jmp sel_
srn1: cmp win_x,2 ;Edit Window
jne srn2
call edit_win
jmp sel_
srn2: cmp win_x,3 ;Utility Window
jne srn3
call utl_win
jmp sel_
srn3: call block_win ;Block Window
jmp sel_
exit_w: GOTOXY pos_x,pos_y
CURSOR_1
pop cx
pop ax
ret
windows endp
file_win proc near ;+------+
push ax ;| File |
push bx ;+------+
push cx
push es
push si
push di
mov es,monitor
mov cx,6 ;[File] be reversed
mov di,7
mov al,reverse1
f_6: mov es:[di],al
add di,2
loop f_6
cld
draw_f: mov si,offset win_file+3 ;Draw File Window
xor cx,cx
mov cl,win_file+1
xor bx,bx
loopf2: mov di,y_table[bx+2]
add bx,2
add di,4
push cx
pushf
xor cx,cx
mov al,win_file+2
mov cl,win_file
loopf1: movsb
stosb
loop loopf1
popf
pop cx
loop loopf2
mov bx,win_y ;Mark Selection
shl bx,1
mov di,y_table[bx+2]
add di,7
xor cx,cx
mov cl,win_file
sub cl,2
mov al,reverse3
rev_f: mov es:[di],al
add di,2
loop rev_f
get_f: GET_CHAR
call l_or_r ;If Left or Right
cmp al,0
je n_r_l
jmp end_f
n_r_l: mov ax,file_max
push ax ;If Up or Down
call u_or_d
cmp al,0
je key_f
jmp draw_f
key_f: cmp char,f10
jne n_f10
jmp end_f
n_f10: cmp char,escape
jne nextf1
mov char,f10
jmp end_f
nextf1: cmp char,enter_s
je chk_y
jmp get_f
chk_y: cmp win_y,1 ;LOAD
jne chk_y2
call load_act
call refresh_
call info_win
GOTOXY pos_x,pos_y
mov char,f10
jmp end_f
chk_y2: cmp win_y,2 ;SAVE
jne chk_y3
mov ax,offset this_dir[1]
push ax
call save_act
call refresh_
mov char,f10
jmp end_f
chk_y3: cmp win_y,3 ;Write to
jne chk_y4
CURSOR_1
call write_act
CURSOR_0
jmp end_f
chk_y4: cmp win_y,4 ;New
jne chk_y5
call new_act
jmp end_f
chk_y5: cmp win_y,5
jne chk_y6
; call os_shell
mov char,f10
jmp end_f
chk_y6: CURSOR_1 ;Exit to DOS
mov al,0
xor cx,cx
mov dx,184fh
mov bh,07
mov ah,6
int 10h
mov dx,offset good_bye
mov ah,09h
int 21h
mov ah,4ch
int 21h
end_f: pop di
pop si
pop es
pop cx
pop bx
pop ax
ret
file_win endp
new_act proc near
call newing
mov total_l,1
mov cursor_x,1
mov cursor_y,1
mov pos_x,1
mov pos_y,2
GOTOXY pos_x,pos_y
mov col_start,1
mov block_top,1
mov block_end,1
call info_win
mov char,f10
ret
new_act endp
edit_win proc near ;+------+
push di ;| Edit |
push es ;+------+
push ax
push cx
pushf
mov es,monitor
mov cx,6 ;[Edit] be reversed
mov di,25
mov al,reverse1
e_6: mov es:[di],al
add di,2
loop e_6
get_e: GET_CHAR
call l_or_r
cmp al,0
jne end_e
cmp char,f10
je end_e
cmp char,enter_s
jne get_e
mov char,f10
end_e: popf
pop cx
pop ax
pop es
pop di
ret
edit_win endp
utl_win proc near ;+---------+
push ax ;| Utility |
push bx ;+---------+
push cx
push es
push si
push di
cld
mov es,monitor
mov cx,9 ;[Utility] be reversed
mov di,43
mov al,reverse1
u_9: mov es:[di],al
add di,2
loop u_9
draw_u: mov si,offset win_utl+3 ;Draw File Window
xor cx,cx
mov cl,win_utl+1
xor bx,bx
loopu2: mov di,y_table[bx+2]
add bx,2
add di,40
push cx
pushf
xor cx,cx
mov al,win_utl+2
mov cl,win_utl
loopu1: movsb
stosb
loop loopu1
popf
pop cx
loop loopu2
mov bx,win_y ;Mark Selection
shl bx,1
mov di,y_table[bx+2]
add di,43
xor cx,cx
mov cl,win_utl
sub cl,2
mov al,reverse3
rev_u: mov es:[di],al
add di,2
loop rev_u
get_u: GET_CHAR
call l_or_r
cmp al,0
je _y_
jmp end_u
_y_: mov ax,utl_max
push ax ;If Up or Down
call u_or_d
cmp al,0
je key_u
jmp draw_u
key_u: cmp char,f10 ;F10
je end_u
jne u_f10
jmp end_u
u_f10: cmp char,escape ;ESC
jne nextu1
mov char,f10
jmp end_u
nextu1: cmp char,enter_s
je chk_yu
jmp get_u
chk_yu: cmp win_y,1 ;HELP
jne chk_u2
call help_win
jmp end_u
chk_u2: cmp win_y,2 ;Change Drive
jne chk_u3
CURSOR_1
call chg_drive
mov char,f10
jmp end_u
CHK_u3: cmp win_y,3
jne chk_u4
mov char,f10
jmp end_u
chk_u4: cmp win_y,4 ;Print
jne chk_u5
mov ax,1
push ax
mov ax,total_l
push ax
call print_act
mov char,f10
jmp end_u
chk_u5: ;Lock Terminal
mov char,f10
jmp end_u
end_u: pop di
pop si
pop es
pop cx
pop bx
pop ax
ret
utl_win endp
block_win proc near ;+-------+
push ax ;| Block |
push bx ;+-------+
push cx
push es
push si
push di
cld
mov es,monitor
mov cx,7 ;[Block] be reversed
mov di,67
mov al,reverse1
b_7: mov es:[di],al
add di,2
loop b_7
draw_b: mov si,offset win_block+3 ;Draw File Window
xor cx,cx
mov cl,win_block+1
xor bx,bx
loopb2: mov di,y_table[bx+2]
add bx,2
add di,64
push cx
pushf
xor cx,cx
mov al,win_block+2
mov cl,win_block
loopb1: movsb
stosb
loop loopb1
popf
pop cx
loop loopb2
mov bx,win_y ;Mark Selection
shl bx,1
mov di,y_table[bx+2]
add di,67
xor cx,cx
mov cl,win_block
sub cl,2
mov al,reverse3
rev_b: mov es:[di],al
add di,2
loop rev_b
get_b: GET_CHAR
call l_or_r
cmp al,0
jne end_b
mov ax,block_max
push ax ;If Up or Down
call u_or_d
cmp al,0
je key_b
jmp draw_b
key_b: cmp char,f10
je end_b
jmp get_b
end_b: pop di
pop si
pop es
pop cx
pop bx
pop ax
ret
block_win endp
l_or_r proc near ;Right or Left Key <- ->
mov al,0 ;Set a Boolean AL=0
cmp char,left
jne next1
cmp win_x,1
ja x_min
mov win_x,win_max+1
x_min: dec win_x
mov al,1
next1: cmp char,right
jne next2
cmp win_x,win_max
jb x_max
mov win_x,0
x_max: inc win_x
mov al,1 ;Right or Left is True
next2: ret
l_or_r endp
u_or_d proc near ;Up or Down Key
push bp
mov bp,sp
push dx
mov dx,[bp+4]
mov al,0 ;Set a Boolean AL=0
cmp char,up
jne nextv1
cmp win_y,1
ja y_min
mov win_y,dx
inc win_y
y_min: dec win_y
mov al,1 ;Up or Down is True
nextv1: cmp char,down
jne nextv2
cmp win_y,dx
jb y_max
mov win_y,0
y_max: inc win_y
mov al,1 ;Up or Down is True
nextv2: pop dx
pop bp
ret 2
u_or_d endp
itoa_5 proc near ;Stack Put Addr. of Data
push bp ;Stack Put Value of Data
mov bp,sp
push ax
push bx
push cx
push dx
push si
push di
push es
pushf
std
mov ax,ds
mov es,ax
mov si,[bp+6]
mov dl,' '
mov [si],dl
mov [si+1],dl
mov [si+2],dl
mov [si+3],dl
mov [si+4],dl
mov ax,[bp+4]
mov bx,10
loopd5: mov si,[bp+6]
add si,3
mov di,si
inc di
mov dx,0
div bx
add dl,30h
mov cx,4
rep movsb
mov [si+1],dl
cmp ax,0
jne loopd5
popf
pop es
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop bp
ret 4
itoa_5 endp
itoa_3 proc near
push ax
push bx
push cx
push dx
push si
pushf
mov si,offset str_x
mov str_x,' '
mov str_x[1],' '
mov str_x[2],' '
mov ax,cursor_x
mov bx,10
loopd3: mov dx,0
div bx
add dl,30h
mov cl,[si+1]
mov [si+2],cl
mov cl,[si]
mov [si+1],cl
mov [si],dl
cmp ax,0
jne loopd3
popf
pop si
pop dx
pop cx
pop bx
pop ax
ret
itoa_3 endp
extra_del proc near ;Add 2 Lines to be 1 Line
mov es,p_ptr
mov ax,es:[0]
mov q_ptr,ax
mov ax,p_ptr
mov r_ptr,ax
cld
xor cx,cx
mov cl,line_buf
inc cx
mov ax,seg sub_line
mov es,ax
mov di,offset sub_line
mov si,offset line_buf
rep movsb ;Sub_line = Line_buf
mov cl,line_buf
inc cx
neg cx
add cx,cursor_x
cmp cx,0
je no_20h
_fill: mov byte ptr [di],' '
inc di
loop _fill
no_20h: mov es,p_ptr ;Move Next Line UP
mov ax,es:[0]
mov p_ptr,ax
call put_buff
xor cx,cx
mov cl,line_buf
cmp cx,0
je del_nx
mov ax,offset sub_line+1
mov bx,di
sub bx,ax
mov ax,bx
add bx,cx
cmp bx,255
jbe ad_sub
neg ax
add ax,255
mov cx,ax
ad_sub: mov si,offset line_buf+1
mov ax,seg sub_line
mov es,ax
cld
rep movsb
mov bx,offset sub_line+1
mov cx,di
sub cx,bx
mov line_buf,cl
mov ax,seg line_buf
mov es,ax
mov di,offset line_buf+1
mov si,offset sub_line+1
cld
rep movsb
mov ax,r_ptr
mov p_ptr,ax
call get_buff
del_nx: mov es,q_ptr
push es
mov ax,es:[0]
mov es,r_ptr
mov es:[0],ax
pop es
xor cx,cx
mov cl,es:[2]
FREE_ q_ptr
cmp cx,0
je extr_z
dis_2: mov ax,es:[30]
mov es,ax
FREE_ ax
loop dis_2
extr_z: dec total_l
mov ax,cursor_y
cmp ax,block_top
jb bk_1e
cmp ax,block_end
jb bk_2e
jmp bk_ze
bk_1e: dec block_top
bk_2e: dec block_end
bk_ze: call info_win
call refresh_
ret
extra_del endp
s_c_key proc near
cmp scan_key,n_key ;[N/n] pressed
jne s_c_1
call ins_line
jmp s_c_z
s_c_1: cmp scan_key,y_key ;[Y/y] pressed
jne s_c_2
mov ax,cursor_y
cmp ax,block_top
jb bk_1d
cmp ax,block_end
jb bk_2d
jmp bk_zd
bk_1d: dec block_top
bk_2d: dec block_end
bk_zd: call del_line
jmp s_c_z
s_c_2: cmp scan_key,b_key ;[B/b] pressed
jne s_c_3
mov ax,cursor_y
mov block_top,ax
call refresh_
jmp s_c_z
s_c_3: cmp scan_key,k_key ;[K/k] pressed
jne s_c_4
mov ax,cursor_y
mov block_end,ax
call refresh_
jmp s_c_z
s_c_4: cmp scan_key,h_key ;[H/h] pressed
jne s_c_5
mov ax,block_top
mov block_end,ax
call refresh_
jmp s_c_z
s_c_5: cmp scan_key,m_key ;[M/m] pressed
jne s_c_6
mov cx,block_end
cmp cx,block_top
jbe no_m_
cmp cx,cursor_y
jae m_1_
mov pos_y,2
GOTOXY pos_x,pos_y
call ptr_move
sub cx,block_top
sub cursor_y,cx
mov ax,cursor_y
mov block_top,ax
add ax,cx
mov block_end,ax
call refresh_
jmp s_c_z
m_1_: mov ax,block_top
cmp ax,cursor_y
jbe no_m_
call ptr_move
mov ax,cursor_y
sub cx,block_top
mov block_top,ax
mov block_end,ax
add block_end,cx
call refresh_
no_m_: jmp s_c_z
s_c_6: cmp scan_key,o_key ;[O/o] pressed
je _6_ok
jmp s_c_7
_6_ok: mov cx,block_end
cmp cx,block_top
jbe chk_no
mov ax,cursor_y
cmp ax,block_top
jb yes_c_
cmp ax,block_end
jae yes_c_
chk_no: jmp no_c_
yes_c_: push ax
call find_ptr
mov ax,p_ptr
mov p_lin,ax
mov ax,r_ptr
mov es,ax
mov bx,block_top
push bx
call find_ptr
call put_buff
mov bx,p_ptr
NEW_
mov es:[0],ax
push es
mov es,ax
mov byte ptr es:[2],0
mov word ptr es:[30],0
pop es
mov p_ptr,ax
call get_buff
sub cx,block_top
push cx
dec cx
cmp cx,0
je cpy_z
r_cpy: push es
mov es,bx
mov bx,es:[0]
mov p_ptr,bx
pop es
call put_buff
mov es,es:[0]
NEW_
mov es:[0],ax
push es
mov es,ax
mov byte ptr es:[2],0
mov word ptr es:[30],0
pop es
mov p_ptr,ax
call get_buff
loop r_cpy
cpy_z: pop cx
mov es,p_ptr
mov ax,p_lin
mov es:[0],ax
mov ax,cursor_y
mov block_top,ax
mov block_end,ax
add block_end,cx
add total_l,cx
call refresh_
call info_win
no_c_: jmp s_c_z
s_c_7: cmp scan_key,d_key ;[D/d] pressed
jne s_c_8
mov cx,block_end
cmp cx,block_top
jbe no_d_
sub cx,block_top
mov pos_y,2
GOTOXY pos_x,pos_y
mov ax,block_top
mov block_end,ax
d_blk: mov cursor_y,ax
call del_line
loop d_blk
no_d_: jmp s_c_z
s_c_8: cmp scan_key,p_key ;[P/p] pressed
jne s_c_z
mov cx,block_top
cmp cx,block_end
jae s_c_z
push cx
mov ax,block_end
sub ax,cx
push ax
call print_act
call refresh_
s_c_z:
ret
s_c_key endp
ptr_move proc near
mov ax,block_top
push ax
call find_ptr
mov es,r_ptr ;ES
mov ax,p_ptr ;P_lin
mov p_lin,ax
mov ax,block_end
push ax
call find_ptr
mov bx,r_ptr ;BX
mov ax,p_ptr ;Q_lin
mov q_lin,ax
mov ax,cursor_y
push ax
call find_ptr ;R_ptr
;P_ptr
mov ax,q_lin
mov es:[0],ax
mov es,bx
mov ax,p_ptr
mov es:[0],ax
mov es,r_ptr
mov ax,p_lin
mov es:[0],ax
ret
ptr_move endp
show_name proc near
push es
push si
push di
mov es,monitor
mov di,y_table[48]
mov si,offset this_dir[1]
mov al,0eh
mov cl,this_dir
xor ch,ch
lll: movsb
stosb
loop lll
mov cl,this_dir
neg cx
add cx,80
clr_el: mov byte ptr es:[di],' '
mov byte ptr es:[di+1],0eh
add di,2
loop clr_el
pop di
pop si
pop es
ret
show_name endp
here_dir proc near
mov ah,19h ;GET Current Drive
int 21h
add al,65
mov this_dir[1],al
mov this_dir[2],':'
mov this_dir[3],'\'
mov si,offset this_dir[4] ;GET Current Directory
mov dl,0
mov ah,47h
int 21h
mov al,0
mov cx,64
mov di,offset this_dir[1]
cpr_0: cmp byte ptr [di],0
je __dir
inc al
inc di
loop cpr_0
__dir: cmp al,3
jne slash_
dec al
dec di
slash_: add al,13
mov this_dir,al
mov byte ptr [di],'\'
inc di
mov cx,13
mov ax,seg this_dir
mov es,ax
mov si,offset file_name
rep movsb
call show_name
ret
here_dir endp
read_line proc near ;Stack Put [Offset of Line]
push bp ;DL put X-axis
mov bp,sp ;DH put Y-axis
push ax
push bx
push si
push di
push es
xor bx,0
dec dh
sub dl,2
mov bl,dh
shl bx,1
mov es,monitor
mov si,y_table[bx]
mov bl,dl
shl bl,1
inc dl
add si,bx
mov cl,0
mov di,[bp+4]
mov bl,[di]
add dl,bl
re_in: mov ah,2
int 10h
xor ch,ch
mov cl,bl
cmp cx,0
je no_c
_one_c: add si,2
inc di
mov al,[di]
mov es:[si],al
loop _one_c
no_c: mov byte ptr es:[si+2],' '
mov byte ptr [di+1],0
sub di,bx
mov byte ptr [di],bl
sub si,bx
sub si,bx
GET_KEY
cmp ascii_key,0
je re_in
cmp ascii_key,backspace
jne rk1
cmp bl,0
je re_in
dec bx
dec dl
jmp re_in
rk1: cmp ascii_key,enter_a
jne rk2
mov cl,1
jmp out_rk
rk2: cmp ascii_key,escape_a
jne rk3
mov cl,0
jmp out_rk
rk3: cmp bl,28
je re_in
inc dl
inc bx
mov al,ascii_key
mov [di+bx],al
jmp re_in
out_rk: pop es
pop di
pop si
pop bx
pop ax
pop bp
ret 2
read_line endp
code ends
;--------------------------------------
stack segment stack
db 2048 dup(?)
stack ends
end start